home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1994 David Mosberger-Tang.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Library General Public License as
- * published by the Free Software Foundation; either version 2, or (at
- * your option) any later version.
- *
- * __bb_exit_func() dumps all the basic-block statistics linked into
- * the bb_head chain to .d files.
- */
- #include <stdio.h>
- #include <strings.h>
- #include "bfd.h"
- #include "gmon_out.h"
-
- /* structure emitted by -a */
- struct bb {
- long zero_word;
- const char *filename;
- long *counts;
- long ncounts;
- struct bb *next;
- const unsigned long *addresses;
- };
-
- struct bb *__bb_head = (struct bb *)0;
-
-
- void
- __bb_exit_func (void)
- {
- const int version = GMON_VERSION;
- struct gmon_hdr ghdr;
- struct bb *ptr;
- FILE *fp;
- /*
- * GEN_GMON_CNT_FILE should be defined on systems with mcleanup()
- * functions that do not write basic-block to gmon.out. In such
- * cases profiling with "-pg -a" would result in a gmon.out file
- * without basic-block info (because the file written here would
- * be overwritten. Thus, a separate file is generated instead.
- * The two files can easily be combined by specifying them
- * on gprof's command line (and possibly generating a gmon.sum
- * file with "gprof -s").
- */
- #ifndef GEN_GMON_CNT_FILE
- # define OUT_NAME "gmon.out"
- #else
- # define OUT_NAME "gmon.cnt"
- #endif
- fp = fopen(OUT_NAME, "wb");
- if (!fp) {
- perror(OUT_NAME);
- return;
- } /* if */
- memcpy(&ghdr.cookie[0], GMON_MAGIC, 4);
- memcpy(&ghdr.version, &version, sizeof(version));
- fwrite(&ghdr, sizeof(ghdr), 1, fp);
-
- for (ptr = __bb_head; ptr != 0; ptr = ptr->next) {
- u_int ncounts = ptr->ncounts;
- u_char tag;
- u_int i;
-
- tag = GMON_TAG_BB_COUNT;
- fwrite(&tag, sizeof(tag), 1, fp);
- fwrite(&ncounts, sizeof(ncounts), 1, fp);
-
- for (i = 0; i < ncounts; ++i) {
- fwrite(&ptr->addresses[i], sizeof(ptr->addresses[0]), 1, fp);
- fwrite(&ptr->counts[i], sizeof(ptr->counts[0]), 1, fp);
- } /* for */
- } /* for */
- fclose (fp);
- } /* __bb_exit_func */
-
- /*** end of __bb_exit_func.c ***/
-